using System;
using System.Reflection;
//使用创建的 DeBugInfo 特性，并使用反射（Reflection）来读取 Rectangle 类中的元数据。
namespace BugFixApplication
{
// 一个自定义特性 BugFix 被赋给类及其成员
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]

public class DeBugInfo : System.Attribute
{
    private int bugNo;
    private string developer;
    private string lastReview;
    public string message;

    public DeBugInfo(int bg, string dev, string d)
    {
        this.bugNo = bg;
        this.developer = dev;
        this.lastReview = d;
    }

    public int BugNo
    {
        get
        {
        return bugNo;
        }
    }
    public string Developer
    {
        get
        {
        return developer;
        }
    }
    public string LastReview
    {
        get
        {
        return lastReview;
        }
    }
    public string Message
    {
        get
        {
        return message;
        }
        set
        {
        message = value;
        }
    }
}
[DeBugInfo(45, "Zara Ali", "12/8/2012",
    Message = "Return type mismatch")]
[DeBugInfo(49, "Nuha Ali", "10/10/2012",
    Message = "Unused variable")]
class Rectangle
{
    // 成员变量
    protected double length;
    protected double width;
    public Rectangle(double l, double w)
    {
        length = l;
        width = w;
    }
    [DeBugInfo(55, "Zara Ali", "19/10/2012",
        Message = "Return type mismatch")]
    public double GetArea()
    {
        return length * width;
    }
    [DeBugInfo(56, "Zara Ali", "19/10/2012")]
    public void Display()
    {
        Console.WriteLine("Length: {0}", length);
        Console.WriteLine("Width: {0}", width);
        Console.WriteLine("Area: {0}", GetArea());
    }
}//end class Rectangle

class ExecuteRectangle
{
    static void Main(string[] args)
    {
        Rectangle r = new Rectangle(4.5, 7.5);
        r.Display();
        Type type = typeof(Rectangle);
        // 遍历 Rectangle 类的特性
        foreach (Object attributes in type.GetCustomAttributes(false))
        {
        DeBugInfo dbi = (DeBugInfo)attributes;
        if (null != dbi)
        {
            Console.WriteLine("Bug no: {0}", dbi.BugNo);
            Console.WriteLine("Developer: {0}", dbi.Developer);
            Console.WriteLine("Last Reviewed: {0}",
                                    dbi.LastReview);
            Console.WriteLine("Remarks: {0}", dbi.Message);
        }
        }
        // 遍历方法特性
        foreach (MethodInfo m in type.GetMethods())
        {
        foreach (Attribute a in m.GetCustomAttributes(true))
        {
            DeBugInfo dbi = (DeBugInfo)a;
            if (null != dbi)
            {
                Console.WriteLine("Bug no: {0}, for Method: {1}",
                                            dbi.BugNo, m.Name);
                Console.WriteLine("Developer: {0}", dbi.Developer);
                Console.WriteLine("Last Reviewed: {0}",
                                            dbi.LastReview);
                Console.WriteLine("Remarks: {0}", dbi.Message);
            }
        }
        }
        Console.ReadLine();
    }
}
}